package com.cgg.java8.ch02;

import org.junit.Test;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 * @author Created by xiecheng on 2021/8/26
 *
 * 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式：它没有名称，
 * 但它有参数列表、函数主体、返回类型，可能还有一个可以抛出的异常列表。
 *
 * 这里演示一个读取文件的Demo, 并从没有使用lambda, 到使用lambda的演进过程
 */
public class Demo01 {

    /**
     * 这是最基本的玩法, 每次都需要去编写读取文件,关闭资源的代码.(jdk7后可以使用try,如下代码所示)
     * 这其中唯一的差别在于 得到bufferReader后的操作. 所以可以把这个操作作为一个行为参数, 传递进来
     *
     * @throws IOException
     */
    @Test
    public void readOneLine() throws IOException {
        try (BufferedReader br = new BufferedReader(new FileReader("src/main/resources/data.txt"))) {
            System.out.println(br.readLine());  // 这段代码时执行的核心逻辑
        }
    }

    /**
     * 使用函数式接口来传递行为
     */
    @Test
    public void processFile() throws IOException {
        // 读一行数据
        System.out.println(process(BufferedReader::readLine));
        // 读两行
        System.out.println(process(br -> br.readLine().concat(":").concat(br.readLine())));
    }

    private String process(BufferReaderProcessor processor) throws IOException{
        try (BufferedReader br = new BufferedReader(new FileReader("src/main/resources/data.txt"))) {
            return processor.process(br);
        }

    }
}